package com.giser.testapp.lib.Location;

import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;

import com.giser.testapp.lib.App.EnvApplication;
import com.giser.testapp.lib.Tool.EnvLog;

/**
 * Created by Lss on 2017/11/28.
 */

public class AndroidLocation implements LocationListener {
    private static final int TWO_MINUTES = 1000 * 1 * 2;
    /*private long locationTime_GPS=5000;
    private float locationDistance_GPS=0;*/
    /*
    private LocationManager locationManager = null;
    public AndroidLocation(){

    }
    *//**
     * 初始化定位
     *//*
    private void initLocation(){
        //初始化client
        locationManager=(LocationManager)EnvApplication.getApplication().getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        //此处的判定是主要问题，API23之后需要先判断之后才能调用locationManager中的方法包括这里的getLastKnewnLocation方法和requestLocationUpdates方法
        if(ContextCompat.checkSelfPermission(EnvApplication.getApplication().getApplicationContext(),android.Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            if(locationManager!=null){
                if(PhoneStateUtil.isGpsProviderEnabled(EnvApplication.getApplication().getApplicationContext())){
                    EnvLog.i("GpsProvider");
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, locationTime_GPS, locationDistance_GPS, this);
                }else{
                    AlertUtil.createDialog_GPS(EnvApplication.getApplication().getApplicationContext(),"友情提示","定位服务未开启，请先开启定位服务！",0);
                }
            }
        }else{
            EnvLog.i("dfewsw");
            AlertUtil.createDialog(EnvApplication.getApplication().getApplicationContext(),"友情提示","系统未授权定位服务！");
        }
    }

    public void start(){


    }*/
    @Override
    public void onLocationChanged(Location location) {
        EnvLog.i(" onLocationChanged location="+location.toString());
        EnvApplication.getApplication().geographicLocation= LocationConverter.androdiToGeographicLocation(EnvApplication.getApplication(),location, EnvApplication.getApplication().geographicLocation);

        /*if (isBetterLocation(location, EnvApplication.getApplication().lastLocation))
        {
            EnvLog.i("isBetterLocation is true");
            EnvApplication.getApplication().geographicLocation= LocationConverter.toGeographicLocation(EnvApplication.getApplication(),location, EnvApplication.getApplication().lastLocation);
        }*/
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        EnvLog.i("status="+status);
    }

    @Override
    public void onProviderEnabled(String provider) {
        EnvLog.i("onProviderEnabled provider="+provider);
    }

    @Override
    public void onProviderDisabled(String provider) {
        EnvLog.i("onProviderDisabled provider="+provider);
    }

    /**
     * Determines whether one Location reading is better than the current Location fix
     *
     * @param location The new Location that you want to evaluate
     * @param currentBestLocation The current Location fix, to which you want to compare the new one
     */
    protected boolean isBetterLocation(Location location, Location currentBestLocation)
    {
        if (currentBestLocation == null)
        {
            // A new location is always better than no location
            return true;
        }

        // Check whether the new location fix is newer or older
        long timeDelta = location.getTime() - currentBestLocation.getTime();
        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
        boolean isNewer = timeDelta > 0;

        // If it's been more than two minutes since the current location, use
        // the new location
        // because the user has likely moved
        if (isSignificantlyNewer)
        {
            return true;
            // If the new location is more than two minutes older, it must be
            // worse
        }
        else if (isSignificantlyOlder)
        {
            return false;
        }

        // Check whether the new location fix is more or less accurate
        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
        boolean isLessAccurate = accuracyDelta > 0;
        boolean isMoreAccurate = accuracyDelta < 0;
        boolean isSignificantlyLessAccurate = accuracyDelta > 200;

        // Check if the old and new location are from the same provider
        boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());

        // Determine location quality using a combination of timeliness and
        // accuracy
        if (isMoreAccurate)
        {
            return true;
        }
        else if (isNewer && !isLessAccurate)
        {
            return true;
        }
        else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider)
        {
            return true;
        }
        return false;
    }

    /** Checks whether two providers are the same */
    private boolean isSameProvider(String provider1, String provider2)
    {
        if (provider1 == null)
        {
            return provider2 == null;
        }
        return provider1.equals(provider2);
    }
}
